1 Get Data Ready

#load in workspaces from previos models
load('env.RData') #knn
load("dt_env.Rdata") #regression tree
load("my_env.Rdata") #linear regression
load("naive_env.Rdata") #naive model

1.1 Atlanta Hotel

#best models for hotel 1
best_naive #naive model
best_model_lin  #linear model
best_model_knn #knn
best_model_rt #regression tree
#combine into one dataframe to have a dataframe of all predicted cancellation rates
best_model_knn$knn_predict_cxl_rate <-  best_model_knn$predict_cxl_rate
best_model_rt$rt_predict_cxl_rate <-  best_model_rt$predict_cxl_rate
best_naive$naive_predict_cxl_rate <- best_naive$predict_cxl_rate
hot1_best_df <- left_join(best_naive, best_model_lin, by = c('days_prior', 'stay_dt', 'product_type'))
hot1_best_df <- left_join(hot1_best_df, best_model_knn, by = c('days_prior', 'stay_dt', 'product_type'))
hot1_best_df <- left_join(hot1_best_df, best_model_rt, by = c('days_prior', 'stay_dt', 'product_type'))
avg_svv_rt <- sum(hot1_best_df$OTB_to_survive.x)/sum(hot1_best_df$OTB.x)
hot1_best_df <- data.frame(hot1_best_df$true_cxl_rate, hot1_best_df$naive_predict_cxl_rate, hot1_best_df$lin_predict_cxl_rate, hot1_best_df$knn_predict_cxl_rate, hot1_best_df$rt_predict_cxl_rate, hot1_best_df$OTB.x, hot1_best_df$OTB_to_survive.x, hot1_best_df$days_prior)
#rename columns
hot1_best_df$true_cxl_rate <- hot1_best_df$hot1_best_df.true_cxl_rate
hot1_best_df$naive_predict_cxl_rate <- hot1_best_df$hot1_best_df.naive_predict_cxl_rate
hot1_best_df$lin_predict_cxl_rate <- hot1_best_df$hot1_best_df.lin_predict_cxl_rate
hot1_best_df$knn_predict_cxl_rate <- hot1_best_df$hot1_best_df.knn_predict_cxl_rate
hot1_best_df$rt_predict_cxl_rate <- hot1_best_df$hot1_best_df.rt_predict_cxl_rate
hot1_best_df$OTB <- hot1_best_df$hot1_best_df.OTB.x
hot1_best_df$OTB_to_survive <- hot1_best_df$hot1_best_df.OTB_to_survive.x
hot1_best_df$days_prior <- hot1_best_df$hot1_best_df.days_prior
#run linear regression of all to find weights
all_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df)
summary(all_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.089632 -0.009137  0.000509  0.014567  0.150745 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0336080  0.0008352  40.241 < 0.0000000000000002 ***
naive_predict_cxl_rate  0.5033760  0.0097732  51.506 < 0.0000000000000002 ***
lin_predict_cxl_rate   -0.0228510  0.0029252  -7.812  0.00000000000000675 ***
knn_predict_cxl_rate   -0.0463775  0.0044631 -10.391 < 0.0000000000000002 ***
rt_predict_cxl_rate     0.0402261  0.0042898   9.377 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02404 on 5272 degrees of freedom
Multiple R-squared:  0.3798,    Adjusted R-squared:  0.3794 
F-statistic: 807.2 on 4 and 5272 DF,  p-value: < 0.00000000000000022
#new prediction given above weights
hot1_best_df$predict_cxl_rate = (hot1_best_df$naive_predict_cxl_rate*0.5033760 + hot1_best_df$lin_predict_cxl_rate*-0.0228510 + hot1_best_df$knn_predict_cxl_rate*-0.0463775 +hot1_best_df$rt_predict_cxl_rate*0.0402261)
eval(hot1_best_df)
#try to do by different days of week
hot1_best_df_dp1 <- hot1_best_df[hot1_best_df$days_prior <= 7, ] 
hot1_best_df_dp2 <- hot1_best_df[hot1_best_df$days_prior <= 14, ]
hot1_best_df_dp3 <- hot1_best_df[hot1_best_df$days_prior <= 21, ]
hot1_best_df_dp4 <- hot1_best_df[hot1_best_df$days_prior <= 28, ]
hot1_best_df_dp5 <- hot1_best_df[hot1_best_df$days_prior <= 32, ]
#run linear regression based on different groups
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp1)
summary(all_dp1_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp1)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.061264 -0.009108  0.000501  0.006238  0.147079 

Coefficients:
                        Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.003679   0.001098  -3.351             0.000829 ***
naive_predict_cxl_rate  0.863681   0.019334  44.672 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.017568   0.005687   3.089             0.002049 ** 
knn_predict_cxl_rate    0.076455   0.011246   6.799      0.0000000000159 ***
rt_predict_cxl_rate    -0.002586   0.008467  -0.305             0.760087    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01732 on 1338 degrees of freedom
Multiple R-squared:  0.6729,    Adjusted R-squared:  0.6719 
F-statistic: 688.2 on 4 and 1338 DF,  p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp2)
summary(all_dp2_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp2)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.049316 -0.007479 -0.001364  0.008123  0.149868 

Coefficients:
                        Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.005310   0.000922   5.760        0.00000000947 ***
naive_predict_cxl_rate  0.813693   0.013375  60.838 < 0.0000000000000002 ***
lin_predict_cxl_rate   -0.014766   0.003947  -3.741             0.000188 ***
knn_predict_cxl_rate    0.003522   0.006778   0.520             0.603330    
rt_predict_cxl_rate     0.013281   0.005880   2.258             0.024005 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01769 on 2469 degrees of freedom
Multiple R-squared:  0.6397,    Adjusted R-squared:  0.6391 
F-statistic:  1096 on 4 and 2469 DF,  p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp3)
summary(all_dp3_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp3)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.080657 -0.007621  0.000347  0.008399  0.153684 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0225312  0.0008864  25.417 < 0.0000000000000002 ***
naive_predict_cxl_rate  0.5892851  0.0112831  52.227 < 0.0000000000000002 ***
lin_predict_cxl_rate   -0.0213036  0.0037598  -5.666     0.00000001576400 ***
knn_predict_cxl_rate   -0.0371264  0.0055836  -6.649     0.00000000003396 ***
rt_predict_cxl_rate     0.0408696  0.0057227   7.142     0.00000000000111 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02131 on 3574 degrees of freedom
Multiple R-squared:  0.484, Adjusted R-squared:  0.4834 
F-statistic:   838 on 4 and 3574 DF,  p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp4)
summary(all_dp4_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp4)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.087130 -0.008424  0.000766  0.012125  0.151073 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0337990  0.0008596  39.318 < 0.0000000000000002 ***
naive_predict_cxl_rate  0.4727465  0.0103214  45.802 < 0.0000000000000002 ***
lin_predict_cxl_rate   -0.0195308  0.0033446  -5.840        0.00000000559 ***
knn_predict_cxl_rate   -0.0480952  0.0049070  -9.801 < 0.0000000000000002 ***
rt_predict_cxl_rate     0.0480794  0.0053159   9.044 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02384 on 4660 degrees of freedom
Multiple R-squared:  0.3674,    Adjusted R-squared:  0.3668 
F-statistic: 676.5 on 4 and 4660 DF,  p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp5)
summary(all_dp5_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot1_best_df_dp5)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.089632 -0.009137  0.000509  0.014567  0.150745 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0336080  0.0008352  40.241 < 0.0000000000000002 ***
naive_predict_cxl_rate  0.5033760  0.0097732  51.506 < 0.0000000000000002 ***
lin_predict_cxl_rate   -0.0228510  0.0029252  -7.812  0.00000000000000675 ***
knn_predict_cxl_rate   -0.0463775  0.0044631 -10.391 < 0.0000000000000002 ***
rt_predict_cxl_rate     0.0402261  0.0042898   9.377 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02404 on 5272 degrees of freedom
Multiple R-squared:  0.3798,    Adjusted R-squared:  0.3794 
F-statistic: 807.2 on 4 and 5272 DF,  p-value: < 0.00000000000000022
#create new predictions
hot1_best_df_dp1$predict_cxl_rate = (hot1_best_df_dp1$naive_predict_cxl_rate*0.863681 + hot1_best_df_dp1$lin_predict_cxl_rate*0.017568 + hot1_best_df_dp1$knn_predict_cxl_rate*0.076455 +hot1_best_df_dp1$rt_predict_cxl_rate*-0.002586)
hot1_best_df_dp2$predict_cxl_rate = (hot1_best_df_dp2$naive_predict_cxl_rate*0.813693 + hot1_best_df_dp2$lin_predict_cxl_rate*-0.014766 + hot1_best_df_dp2$knn_predict_cxl_rate*0.003522 +hot1_best_df_dp2$rt_predict_cxl_rate*0.013281)
hot1_best_df_dp3$predict_cxl_rate = (hot1_best_df_dp3$naive_predict_cxl_rate*0.5892851 + hot1_best_df_dp3$lin_predict_cxl_rate*-0.0213036 + hot1_best_df_dp3$knn_predict_cxl_rate*-0.0371264 +hot1_best_df_dp3$rt_predict_cxl_rate*0.0408696)
hot1_best_df_dp4$predict_cxl_rate = (hot1_best_df_dp4$naive_predict_cxl_rate*0.4727465 + hot1_best_df_dp4$lin_predict_cxl_rate*-0.0195308 + hot1_best_df_dp4$knn_predict_cxl_rate*-0.0480952 +hot1_best_df_dp4$rt_predict_cxl_rate*-0.0480952)
hot1_best_df_dp5$predict_cxl_rate = (hot1_best_df_dp5$naive_predict_cxl_rate*0.5033760 + hot1_best_df_dp5$lin_predict_cxl_rate*-0.0228510 + hot1_best_df_dp5$knn_predict_cxl_rate*-0.0463775 +hot1_best_df_dp5$rt_predict_cxl_rate*0.0402261)
hot1_best_grouped <- merge(hot1_best_df_dp1,hot1_best_df_dp2, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp3, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp4, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp5, all = TRUE)
eval(hot1_best_grouped)
#choose naive and linear
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp1)
summary(all_dp1_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot1_best_df_dp1)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.052072 -0.009857  0.000823  0.007365  0.142370 

Coefficients:
                        Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.003256   0.001104  -2.950              0.00323 ** 
naive_predict_cxl_rate  0.906583   0.018262  49.644 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.025763   0.005434   4.741           0.00000235 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0176 on 1340 degrees of freedom
Multiple R-squared:  0.6616,    Adjusted R-squared:  0.6611 
F-statistic:  1310 on 2 and 1340 DF,  p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp2)
summary(all_dp2_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot1_best_df_dp2)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.047292 -0.007540 -0.001397  0.008652  0.149226 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0056263  0.0009133   6.161       0.000000000844 ***
naive_predict_cxl_rate  0.8224800  0.0127249  64.636 < 0.0000000000000002 ***
lin_predict_cxl_rate   -0.0120550  0.0037317  -3.230              0.00125 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0177 on 2471 degrees of freedom
Multiple R-squared:  0.6388,    Adjusted R-squared:  0.6385 
F-statistic:  2185 on 2 and 2471 DF,  p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp3)
summary(all_dp3_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot1_best_df_dp3)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.079794 -0.007634  0.000436  0.008833  0.153359 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0240792  0.0008663  27.795 < 0.0000000000000002 ***
naive_predict_cxl_rate  0.5766591  0.0107459  53.663 < 0.0000000000000002 ***
lin_predict_cxl_rate   -0.0205055  0.0036514  -5.616         0.0000000211 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02154 on 3576 degrees of freedom
Multiple R-squared:  0.4723,    Adjusted R-squared:  0.472 
F-statistic:  1600 on 2 and 3576 DF,  p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp4)
summary(all_dp4_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot1_best_df_dp4)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.081060 -0.007912  0.001561  0.012094  0.150340 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0361052  0.0008283  43.587 < 0.0000000000000002 ***
naive_predict_cxl_rate  0.4452861  0.0098456  45.227 < 0.0000000000000002 ***
lin_predict_cxl_rate   -0.0173648  0.0033046  -5.255          0.000000155 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02421 on 4662 degrees of freedom
Multiple R-squared:  0.3472,    Adjusted R-squared:  0.3469 
F-statistic:  1240 on 2 and 4662 DF,  p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot1_best_df_dp5)
summary(all_dp5_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot1_best_df_dp5)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.084839 -0.008035  0.001193  0.014580  0.149376 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0352802  0.0008219  42.927 < 0.0000000000000002 ***
naive_predict_cxl_rate  0.4732764  0.0093814  50.448 < 0.0000000000000002 ***
lin_predict_cxl_rate   -0.0183609  0.0028350  -6.476       0.000000000102 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02441 on 5274 degrees of freedom
Multiple R-squared:  0.3604,    Adjusted R-squared:  0.3602 
F-statistic:  1486 on 2 and 5274 DF,  p-value: < 0.00000000000000022
#create new predictions
hot1_best_df_dp1$predict_cxl_rate = (hot1_best_df_dp1$naive_predict_cxl_rate*0.906583 + hot1_best_df_dp1$lin_predict_cxl_rate*0.025763)
hot1_best_df_dp2$predict_cxl_rate = (hot1_best_df_dp2$naive_predict_cxl_rate*0.8224800 + hot1_best_df_dp2$lin_predict_cxl_rate*-0.0120550)
hot1_best_df_dp3$predict_cxl_rate = (hot1_best_df_dp3$naive_predict_cxl_rate*0.5766591 + hot1_best_df_dp3$lin_predict_cxl_rate*-0.0205055)
hot1_best_df_dp4$predict_cxl_rate = (hot1_best_df_dp4$naive_predict_cxl_rate*0.4452861 + hot1_best_df_dp4$lin_predict_cxl_rate*-0.0173648)
hot1_best_df_dp5$predict_cxl_rate = (hot1_best_df_dp5$naive_predict_cxl_rate*0.4732764 + hot1_best_df_dp5$lin_predict_cxl_rate*-0.0183609 )
hot1_best_grouped <- merge(hot1_best_df_dp1,hot1_best_df_dp2, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp3, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp4, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp5, all = TRUE)
eval(hot1_best_grouped)
#choose naive and knn
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp1)
summary(all_dp1_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp1)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.056809 -0.008890  0.000887  0.005746  0.148928 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0023304  0.0009951  -2.342               0.0193 *  
naive_predict_cxl_rate  0.8664133  0.0191108  45.336 < 0.0000000000000002 ***
knn_predict_cxl_rate    0.0843757  0.0109570   7.701   0.0000000000000262 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01737 on 1340 degrees of freedom
Multiple R-squared:  0.6705,    Adjusted R-squared:   0.67 
F-statistic:  1364 on 2 and 1340 DF,  p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp2)
summary(all_dp2_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp2)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.046753 -0.007020 -0.001545  0.008639  0.146088 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            0.00477121 0.00088580   5.386         0.0000000787 ***
naive_predict_cxl_rate 0.81186544 0.01294938  62.695 < 0.0000000000000002 ***
knn_predict_cxl_rate   0.00004591 0.00647077   0.007                0.994    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01774 on 2471 degrees of freedom
Multiple R-squared:  0.6373,    Adjusted R-squared:  0.637 
F-statistic:  2171 on 2 and 2471 DF,  p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp3)
summary(all_dp3_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp3)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.081686 -0.007493  0.000686  0.009699  0.148328 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0233960  0.0008479  27.592 < 0.0000000000000002 ***
naive_predict_cxl_rate  0.5811013  0.0107838  53.887 < 0.0000000000000002 ***
knn_predict_cxl_rate   -0.0349455  0.0054198  -6.448       0.000000000129 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02151 on 3576 degrees of freedom
Multiple R-squared:  0.4738,    Adjusted R-squared:  0.4735 
F-statistic:  1610 on 2 and 3576 DF,  p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp4)
summary(all_dp4_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp4)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.088490 -0.008299  0.001919  0.012327  0.146243 

Coefficients:
                        Estimate Std. Error t value            Pr(>|t|)    
(Intercept)             0.035863   0.000819  43.789 <0.0000000000000002 ***
naive_predict_cxl_rate  0.455627   0.009412  48.411 <0.0000000000000002 ***
knn_predict_cxl_rate   -0.042082   0.004818  -8.735 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02409 on 4662 degrees of freedom
Multiple R-squared:  0.3539,    Adjusted R-squared:  0.3536 
F-statistic:  1277 on 2 and 4662 DF,  p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp5)
summary(all_dp5_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp5)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.091858 -0.007807  0.001936  0.014353  0.145113 

Coefficients:
                         Estimate Std. Error t value            Pr(>|t|)    
(Intercept)             0.0351146  0.0008153  43.069 <0.0000000000000002 ***
naive_predict_cxl_rate  0.4789549  0.0089788  53.343 <0.0000000000000002 ***
knn_predict_cxl_rate   -0.0413892  0.0043972  -9.413 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0243 on 5274 degrees of freedom
Multiple R-squared:  0.366, Adjusted R-squared:  0.3657 
F-statistic:  1522 on 2 and 5274 DF,  p-value: < 0.00000000000000022
#create new predictions
hot1_best_df_dp1$predict_cxl_rate = (hot1_best_df_dp1$naive_predict_cxl_rate*0.8664133 + hot1_best_df_dp1$knn_predict_cxl_rate*0.0843757)
hot1_best_df_dp2$predict_cxl_rate = (hot1_best_df_dp2$naive_predict_cxl_rate*0.81186544 + hot1_best_df_dp2$knn_predict_cxl_rate*0.00004591)
hot1_best_df_dp3$predict_cxl_rate = (hot1_best_df_dp3$naive_predict_cxl_rate*0.5811013 + hot1_best_df_dp3$knn_predict_cxl_rate*-0.0349455)
hot1_best_df_dp4$predict_cxl_rate = (hot1_best_df_dp4$naive_predict_cxl_rate*0.455627 + hot1_best_df_dp4$knn_predict_cxl_rate*-0.042082)
hot1_best_df_dp5$predict_cxl_rate = (hot1_best_df_dp5$naive_predict_cxl_rate*0.4789549 + hot1_best_df_dp5$knn_predict_cxl_rate*-0.0413892 )
hot1_best_grouped <- merge(hot1_best_df_dp1,hot1_best_df_dp2, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp3, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp4, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp5, all = TRUE)
eval(hot1_best_grouped)
#choose rt and knn
all_dp1_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp1)
summary(all_dp1_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp1)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.12509 -0.01471 -0.00011  0.01274  0.18342 

Coefficients:
                     Estimate Std. Error t value             Pr(>|t|)    
(Intercept)          0.027892   0.001214  22.981 < 0.0000000000000002 ***
rt_predict_cxl_rate  0.065694   0.012750   5.152          0.000000296 ***
knn_predict_cxl_rate 0.249263   0.016368  15.229 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02738 on 1340 degrees of freedom
Multiple R-squared:  0.1814,    Adjusted R-squared:  0.1801 
F-statistic: 148.4 on 2 and 1340 DF,  p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp2)
summary(all_dp2_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp2)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.138404 -0.015831  0.003126  0.014201  0.165365 

Coefficients:
                      Estimate Std. Error t value            Pr(>|t|)    
(Intercept)          0.0448923  0.0009574  46.891 <0.0000000000000002 ***
rt_predict_cxl_rate  0.0888838  0.0088733  10.017 <0.0000000000000002 ***
knn_predict_cxl_rate 0.0957111  0.0101405   9.438 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02799 on 2471 degrees of freedom
Multiple R-squared:  0.097, Adjusted R-squared:  0.09627 
F-statistic: 132.7 on 2 and 2471 DF,  p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp3)
summary(all_dp3_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp3)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.133967 -0.014403  0.000928  0.013627  0.155983 

Coefficients:
                     Estimate Std. Error t value            Pr(>|t|)    
(Intercept)          0.054677   0.000828  66.038 <0.0000000000000002 ***
rt_predict_cxl_rate  0.079985   0.007432  10.762 <0.0000000000000002 ***
knn_predict_cxl_rate 0.065289   0.006837   9.549 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0285 on 3576 degrees of freedom
Multiple R-squared:  0.0764,    Adjusted R-squared:  0.07589 
F-statistic: 147.9 on 2 and 3576 DF,  p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp4)
summary(all_dp4_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp4)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.127318 -0.014533  0.000188  0.016099  0.148660 

Coefficients:
                      Estimate Std. Error t value            Pr(>|t|)    
(Intercept)          0.0624972  0.0007446   83.93 <0.0000000000000002 ***
rt_predict_cxl_rate  0.0690366  0.0063459   10.88 <0.0000000000000002 ***
knn_predict_cxl_rate 0.0451712  0.0054490    8.29 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02916 on 4662 degrees of freedom
Multiple R-squared:  0.0531,    Adjusted R-squared:  0.05269 
F-statistic: 130.7 on 2 and 4662 DF,  p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot1_best_df_dp5)
summary(all_dp5_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot1_best_df_dp5)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.114629 -0.014184 -0.000396  0.018589  0.145191 

Coefficients:
                      Estimate Std. Error t value             Pr(>|t|)    
(Intercept)          0.0667049  0.0006836  97.572 < 0.0000000000000002 ***
rt_predict_cxl_rate  0.0527287  0.0050981  10.343 < 0.0000000000000002 ***
knn_predict_cxl_rate 0.0418080  0.0051077   8.185 0.000000000000000338 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02985 on 5274 degrees of freedom
Multiple R-squared:  0.04331,   Adjusted R-squared:  0.04295 
F-statistic: 119.4 on 2 and 5274 DF,  p-value: < 0.00000000000000022
#create new predictions
hot1_best_df_dp1$predict_cxl_rate = (hot1_best_df_dp1$rt_predict_cxl_rate*0.065694 + hot1_best_df_dp1$knn_predict_cxl_rate*0.249263)
hot1_best_df_dp2$predict_cxl_rate = (hot1_best_df_dp2$rt_predict_cxl_rate*0.0888838 + hot1_best_df_dp2$knn_predict_cxl_rate*0.0957111)
hot1_best_df_dp3$predict_cxl_rate = (hot1_best_df_dp3$rt_predict_cxl_rate*0.079985 + hot1_best_df_dp3$knn_predict_cxl_rate*0.065289)
hot1_best_df_dp4$predict_cxl_rate = (hot1_best_df_dp4$rt_predict_cxl_rate*0.0690366 + hot1_best_df_dp4$knn_predict_cxl_rate*0.0451712)
hot1_best_df_dp5$predict_cxl_rate = (hot1_best_df_dp5$rt_predict_cxl_rate*0.0527287 + hot1_best_df_dp5$knn_predict_cxl_rate*0.0418080)
hot1_best_grouped <- merge(hot1_best_df_dp1,hot1_best_df_dp2, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp3, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp4, all = TRUE)
hot1_best_grouped <- merge(hot1_best_grouped,hot1_best_df_dp5, all = TRUE)
eval(hot1_best_grouped)
  • Linear Regression and naive results in the best model

1.2 NY Hotel

#best models for hotel 2
best_naive_hot2 #naive model
best_model_lin_hot2  #linear model
best_model_knn_hot2 #knn
best_model_rt_hot2 #regression tree
#combine into one dataframe to have a dataframe of all predicted cancellation rates
best_model_knn_hot2$knn_predict_cxl_rate <-  best_model_knn_hot2$predict_cxl_rate
best_model_rt_hot2$rt_predict_cxl_rate <-  best_model_rt_hot2$predict_cxl_rate
best_naive_hot2$naive_predict_cxl_rate <- best_naive_hot2$predict_cxl_rate
best_model_lin_hot2$lin_predict_cxl_rate <- best_model_lin_hot2$predict_cxl_rate
hot2_best_df <- left_join(best_naive_hot2, best_model_lin_hot2, by = c('days_prior', 'stay_dt', 'product_type'))
hot2_best_df <- left_join(hot2_best_df, best_model_knn_hot2, by = c('days_prior', 'stay_dt', 'product_type'))
hot2_best_df <- left_join(hot2_best_df, best_model_rt_hot2, by = c('days_prior', 'stay_dt', 'product_type'))
avg_svv_rt <- sum(hot2_best_df$OTB_to_survive.x)/sum(hot2_best_df$OTB.x)
hot2_best_df <- data.frame(hot2_best_df$true_cxl_rate, hot2_best_df$naive_predict_cxl_rate, hot2_best_df$lin_predict_cxl_rate, hot2_best_df$knn_predict_cxl_rate, hot2_best_df$rt_predict_cxl_rate, hot2_best_df$OTB.x, hot2_best_df$OTB_to_survive.x, hot2_best_df$days_prior)
#rename columns
hot2_best_df$true_cxl_rate <- hot2_best_df$hot2_best_df.true_cxl_rate
hot2_best_df$naive_predict_cxl_rate <- hot2_best_df$hot2_best_df.naive_predict_cxl_rate
hot2_best_df$lin_predict_cxl_rate <- hot2_best_df$hot2_best_df.lin_predict_cxl_rate
hot2_best_df$knn_predict_cxl_rate <- hot2_best_df$hot2_best_df.knn_predict_cxl_rate
hot2_best_df$rt_predict_cxl_rate <- hot2_best_df$hot2_best_df.rt_predict_cxl_rate
hot2_best_df$OTB <- hot2_best_df$hot2_best_df.OTB.x
hot2_best_df$OTB_to_survive <- hot2_best_df$hot2_best_df.OTB_to_survive.x
hot2_best_df$days_prior <- hot2_best_df$hot2_best_df.days_prior
#run linear regression of all to find weights
all_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df)
summary(all_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.181169 -0.006598  0.000914  0.005871  0.085162 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0021369  0.0004493  -4.756           0.00000201 ***
naive_predict_cxl_rate  0.6723969  0.0110257  60.985 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.3897322  0.0091050  42.804 < 0.0000000000000002 ***
knn_predict_cxl_rate   -0.0913208  0.0065264 -13.992 < 0.0000000000000002 ***
rt_predict_cxl_rate     0.0135764  0.0033473   4.056           0.00005046 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02194 on 6996 degrees of freedom
Multiple R-squared:  0.8734,    Adjusted R-squared:  0.8733 
F-statistic: 1.207e+04 on 4 and 6996 DF,  p-value: < 0.00000000000000022
#new prediction given above weights
hot2_best_df$predict_cxl_rate = (hot2_best_df$naive_predict_cxl_rate*1.0589208 + hot2_best_df$lin_predict_cxl_rate*-0.0190952 + hot2_best_df$knn_predict_cxl_rate*-0.0816610 +hot2_best_df$rt_predict_cxl_rate*0.0050087)
eval(hot2_best_df)
#try to do by different days of week
hot2_best_df_dp1 <- hot2_best_df[hot2_best_df$days_prior <= 7, ] 
hot2_best_df_dp2 <- hot2_best_df[hot2_best_df$days_prior <= 14, ]
hot2_best_df_dp3 <- hot2_best_df[hot2_best_df$days_prior <= 21, ]
hot2_best_df_dp4 <- hot2_best_df[hot2_best_df$days_prior <= 28, ]
hot2_best_df_dp5 <- hot2_best_df[hot2_best_df$days_prior <= 32, ]
#run linear regression based on different groups
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp1)
summary(all_dp1_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp1)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.16149 -0.00465  0.00098  0.00334  0.08825 

Coefficients:
                          Estimate  Std. Error t value             Pr(>|t|)    
(Intercept)            -0.00005633  0.00080767  -0.070              0.94441    
naive_predict_cxl_rate  0.75426014  0.02358126  31.986 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.17832316  0.01121912  15.895 < 0.0000000000000002 ***
knn_predict_cxl_rate   -0.06215385  0.01933997  -3.214              0.00133 ** 
rt_predict_cxl_rate     0.03569091  0.01585239   2.251              0.02448 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01746 on 1771 degrees of freedom
Multiple R-squared:  0.7248,    Adjusted R-squared:  0.7242 
F-statistic:  1166 on 4 and 1771 DF,  p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp2)
summary(all_dp2_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp2)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.179200 -0.005966  0.000497  0.005116  0.090308 

Coefficients:
                         Estimate Std. Error t value            Pr(>|t|)    
(Intercept)            -0.0012641  0.0007181  -1.760              0.0785 .  
naive_predict_cxl_rate  0.9064140  0.0188567  48.068 <0.0000000000000002 ***
lin_predict_cxl_rate    0.2802729  0.0110043  25.469 <0.0000000000000002 ***
knn_predict_cxl_rate   -0.1940328  0.0145604 -13.326 <0.0000000000000002 ***
rt_predict_cxl_rate    -0.0131731  0.0142214  -0.926              0.3544    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02145 on 3314 degrees of freedom
Multiple R-squared:  0.8001,    Adjusted R-squared:  0.7999 
F-statistic:  3317 on 4 and 3314 DF,  p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp3)
summary(all_dp3_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp3)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.176111 -0.007003  0.000164  0.006068  0.094363 

Coefficients:
                         Estimate Std. Error t value            Pr(>|t|)    
(Intercept)             0.0003009  0.0005533   0.544               0.587    
naive_predict_cxl_rate  0.8928911  0.0146451  60.968 <0.0000000000000002 ***
lin_predict_cxl_rate    0.2824946  0.0103314  27.343 <0.0000000000000002 ***
knn_predict_cxl_rate   -0.2276224  0.0101513 -22.423 <0.0000000000000002 ***
rt_predict_cxl_rate     0.0061863  0.0057673   1.073               0.283    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02251 on 4833 degrees of freedom
Multiple R-squared:  0.8279,    Adjusted R-squared:  0.8278 
F-statistic:  5813 on 4 and 4833 DF,  p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp4)
summary(all_dp4_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp4)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.177073 -0.007227  0.000703  0.006089  0.087768 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0015830  0.0004777  -3.314             0.000925 ***
naive_predict_cxl_rate  0.7379078  0.0119469  61.766 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.3569174  0.0095657  37.312 < 0.0000000000000002 ***
knn_predict_cxl_rate   -0.1297209  0.0073943 -17.543 < 0.0000000000000002 ***
rt_predict_cxl_rate     0.0120598  0.0037995   3.174             0.001510 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02236 on 6350 degrees of freedom
Multiple R-squared:  0.8587,    Adjusted R-squared:  0.8586 
F-statistic:  9648 on 4 and 6350 DF,  p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp5)
summary(all_dp5_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate + 
    knn_predict_cxl_rate + rt_predict_cxl_rate, data = hot2_best_df_dp5)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.181169 -0.006598  0.000914  0.005871  0.085162 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0021369  0.0004493  -4.756           0.00000201 ***
naive_predict_cxl_rate  0.6723969  0.0110257  60.985 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.3897322  0.0091050  42.804 < 0.0000000000000002 ***
knn_predict_cxl_rate   -0.0913208  0.0065264 -13.992 < 0.0000000000000002 ***
rt_predict_cxl_rate     0.0135764  0.0033473   4.056           0.00005046 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02194 on 6996 degrees of freedom
Multiple R-squared:  0.8734,    Adjusted R-squared:  0.8733 
F-statistic: 1.207e+04 on 4 and 6996 DF,  p-value: < 0.00000000000000022
#create new predictions
hot2_best_df_dp1$predict_cxl_rate = (hot2_best_df_dp1$naive_predict_cxl_rate*0.934751 + hot2_best_df_dp1$lin_predict_cxl_rate*-0.003968 + hot2_best_df_dp1$knn_predict_cxl_rate*-0.049040 +hot2_best_df_dp1$rt_predict_cxl_rate*0.026188)
hot2_best_df_dp2$predict_cxl_rate = (hot2_best_df_dp2$naive_predict_cxl_rate*1.309082 + hot2_best_df_dp2$lin_predict_cxl_rate*-0.005892 + hot2_best_df_dp2$knn_predict_cxl_rate*-0.303214 +hot2_best_df_dp2$rt_predict_cxl_rate*-0.071875)
hot2_best_df_dp3$predict_cxl_rate = (hot2_best_df_dp3$naive_predict_cxl_rate*1.2606622 + hot2_best_df_dp3$lin_predict_cxl_rate*-0.0174396 + hot2_best_df_dp3$knn_predict_cxl_rate*-0.3234571 +hot2_best_df_dp3$rt_predict_cxl_rate*-0.0070530)
hot2_best_df_dp4$predict_cxl_rate = (hot2_best_df_dp4$naive_predict_cxl_rate*1.1071242 + hot2_best_df_dp4$lin_predict_cxl_rate*-0.0195308 + hot2_best_df_dp4$knn_predict_cxl_rate*-0.1379604 +hot2_best_df_dp4$rt_predict_cxl_rate*0.0009181)
hot2_best_df_dp5$predict_cxl_rate = (hot2_best_df_dp5$naive_predict_cxl_rate*1.0589208 + hot2_best_df_dp5$lin_predict_cxl_rate*-0.0190952 + hot2_best_df_dp5$knn_predict_cxl_rate*-0.0816610 +hot2_best_df_dp5$rt_predict_cxl_rate*0.0050087)
hot2_best_grouped <- merge(hot2_best_df_dp1,hot2_best_df_dp2, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp3, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp4, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp5, all = TRUE)
eval(hot2_best_grouped)
#choose naive and linear
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp1)
summary(all_dp1_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot2_best_df_dp1)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.163076 -0.005680  0.001460  0.003808  0.086314 

Coefficients:
                        Estimate Std. Error t value            Pr(>|t|)    
(Intercept)            0.0003635  0.0006572   0.553                0.58    
naive_predict_cxl_rate 0.7215594  0.0153431  47.028 <0.0000000000000002 ***
lin_predict_cxl_rate   0.1778723  0.0112478  15.814 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01751 on 1773 degrees of freedom
Multiple R-squared:  0.7228,    Adjusted R-squared:  0.7224 
F-statistic:  2311 on 2 and 1773 DF,  p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp2)
summary(all_dp2_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot2_best_df_dp2)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.180120 -0.006658  0.000855  0.005660  0.084257 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0039597  0.0006317  -6.268       0.000000000413 ***
naive_predict_cxl_rate  0.7135702  0.0121601  58.681 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.2946841  0.0111954  26.322 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02212 on 3316 degrees of freedom
Multiple R-squared:  0.7874,    Adjusted R-squared:  0.7873 
F-statistic:  6141 on 2 and 3316 DF,  p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp3)
summary(all_dp3_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot2_best_df_dp3)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.179914 -0.007067  0.001727  0.005002  0.089718 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0017350  0.0005641  -3.076              0.00211 ** 
naive_predict_cxl_rate  0.6690277  0.0106695  62.705 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.2940888  0.0108480  27.110 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02367 on 4835 degrees of freedom
Multiple R-squared:  0.8097,    Adjusted R-squared:  0.8097 
F-statistic: 1.029e+04 on 2 and 4835 DF,  p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp4)
summary(all_dp4_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot2_best_df_dp4)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.180946 -0.006540  0.001772  0.005464  0.087458 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0021238  0.0004848  -4.381             0.000012 ***
naive_predict_cxl_rate  0.6191760  0.0095586  64.777 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.3498547  0.0097665  35.822 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02289 on 6352 degrees of freedom
Multiple R-squared:  0.8519,    Adjusted R-squared:  0.8518 
F-statistic: 1.826e+04 on 2 and 6352 DF,  p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, data = hot2_best_df_dp5)
summary(all_dp5_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + lin_predict_cxl_rate, 
    data = hot2_best_df_dp5)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.182342 -0.005853  0.001694  0.005637  0.085631 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0023600  0.0004527  -5.214          0.000000191 ***
naive_predict_cxl_rate  0.5942390  0.0091040  65.272 < 0.0000000000000002 ***
lin_predict_cxl_rate    0.3814505  0.0091807  41.549 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02225 on 6998 degrees of freedom
Multiple R-squared:  0.8698,    Adjusted R-squared:  0.8697 
F-statistic: 2.337e+04 on 2 and 6998 DF,  p-value: < 0.00000000000000022
#create new predictions
hot2_best_df_dp1$predict_cxl_rate = (hot2_best_df_dp1$naive_predict_cxl_rate*0.908689 + hot2_best_df_dp1$lin_predict_cxl_rate*-0.004495)
hot2_best_df_dp2$predict_cxl_rate = (hot2_best_df_dp2$naive_predict_cxl_rate*1.007202 + hot2_best_df_dp2$lin_predict_cxl_rate*-0.018085)
hot2_best_df_dp3$predict_cxl_rate = (hot2_best_df_dp3$naive_predict_cxl_rate*0.96364090 + hot2_best_df_dp3$lin_predict_cxl_rate*-0.02857291)
hot2_best_df_dp4$predict_cxl_rate = (hot2_best_df_dp4$naive_predict_cxl_rate*0.9723992 + hot2_best_df_dp4$lin_predict_cxl_rate*-0.0287762)
hot2_best_df_dp5$predict_cxl_rate = (hot2_best_df_dp5$naive_predict_cxl_rate*0.9807816 + hot2_best_df_dp5$lin_predict_cxl_rate*-0.0256980 )
hot2_best_grouped <- merge(hot2_best_df_dp1,hot2_best_df_dp2, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp3, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp4, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp5, all = TRUE)
eval(hot2_best_grouped)
#choose naive and knn
all_dp1_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp1)
summary(all_dp1_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp1)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.153942 -0.003982 -0.001084  0.001670  0.098483 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0042185  0.0006956   6.064        0.00000000161 ***
naive_predict_cxl_rate  0.9029219  0.0224797  40.166 < 0.0000000000000002 ***
knn_predict_cxl_rate   -0.0570108  0.0202835  -2.811                0.005 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01866 on 1773 degrees of freedom
Multiple R-squared:  0.6851,    Adjusted R-squared:  0.6847 
F-statistic:  1928 on 2 and 1773 DF,  p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp2)
summary(all_dp2_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp2)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.165253 -0.008951  0.000017  0.004533  0.111381 

Coefficients:
                         Estimate Std. Error t value            Pr(>|t|)    
(Intercept)             0.0011374  0.0006858   1.659              0.0973 .  
naive_predict_cxl_rate  1.1392941  0.0161960  70.344 <0.0000000000000002 ***
knn_predict_cxl_rate   -0.2277196  0.0149681 -15.214 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02351 on 3316 degrees of freedom
Multiple R-squared:  0.7598,    Adjusted R-squared:  0.7596 
F-statistic:  5243 on 2 and 3316 DF,  p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp3)
summary(all_dp3_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp3)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.162560 -0.010644 -0.000102  0.005987  0.114476 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)             0.0015160  0.0005838   2.597              0.00944 ** 
naive_predict_cxl_rate  1.1318749  0.0122575  92.341 < 0.0000000000000002 ***
knn_predict_cxl_rate   -0.2393399  0.0107320 -22.301 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02419 on 4835 degrees of freedom
Multiple R-squared:  0.8013,    Adjusted R-squared:  0.8012 
F-statistic:  9747 on 2 and 4835 DF,  p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp4)
summary(all_dp4_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp4)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.161216 -0.011687 -0.000641  0.006823  0.110207 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0016468  0.0005255  -3.134              0.00174 ** 
naive_predict_cxl_rate  1.0307178  0.0099429 103.664 < 0.0000000000000002 ***
knn_predict_cxl_rate   -0.1118948  0.0080796 -13.849 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02472 on 6352 degrees of freedom
Multiple R-squared:  0.8271,    Adjusted R-squared:  0.8271 
F-statistic: 1.52e+04 on 2 and 6352 DF,  p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp5)
summary(all_dp5_mod)

Call:
lm(formula = true_cxl_rate ~ naive_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp5)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.165406 -0.011369 -0.001181  0.007260  0.108195 

Coefficients:
                         Estimate Std. Error t value             Pr(>|t|)    
(Intercept)            -0.0027375  0.0005033  -5.439         0.0000000555 ***
naive_predict_cxl_rate  0.9940968  0.0091327 108.850 < 0.0000000000000002 ***
knn_predict_cxl_rate   -0.0636097  0.0072490  -8.775 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02471 on 6998 degrees of freedom
Multiple R-squared:  0.8394,    Adjusted R-squared:  0.8394 
F-statistic: 1.829e+04 on 2 and 6998 DF,  p-value: < 0.00000000000000022
#create new predictions
hot2_best_df_dp1$predict_cxl_rate = (hot2_best_df_dp1$naive_predict_cxl_rate*0.9029219 + hot2_best_df_dp1$knn_predict_cxl_rate*-0.0570108)
hot2_best_df_dp2$predict_cxl_rate = (hot2_best_df_dp2$naive_predict_cxl_rate*1.1392941 + hot2_best_df_dp2$knn_predict_cxl_rate*-0.2277196)
hot2_best_df_dp3$predict_cxl_rate = (hot2_best_df_dp3$naive_predict_cxl_rate*1.1318749 + hot2_best_df_dp3$knn_predict_cxl_rate*-0.2393399)
hot2_best_df_dp4$predict_cxl_rate = (hot2_best_df_dp4$naive_predict_cxl_rate*1.0307178 + hot2_best_df_dp4$knn_predict_cxl_rate*-0.1118948)
hot2_best_df_dp5$predict_cxl_rate = (hot2_best_df_dp5$naive_predict_cxl_rate*0.9940968 + hot2_best_df_dp5$knn_predict_cxl_rate*-0.0636097)
hot2_best_grouped <- merge(hot2_best_df_dp1,hot2_best_df_dp2, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp3, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp4, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp5, all = TRUE)
eval(hot2_best_grouped)
#choose rt and knn
all_dp1_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp1)
summary(all_dp1_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp1)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.121303 -0.012040 -0.003139  0.008643  0.172732 

Coefficients:
                     Estimate Std. Error t value             Pr(>|t|)    
(Intercept)          0.003713   0.001118   3.320             0.000919 ***
rt_predict_cxl_rate  0.210950   0.021879   9.642 < 0.0000000000000002 ***
knn_predict_cxl_rate 0.478290   0.020192  23.687 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02514 on 1773 degrees of freedom
Multiple R-squared:  0.4284,    Adjusted R-squared:  0.4278 
F-statistic: 664.5 on 2 and 1773 DF,  p-value: < 0.00000000000000022
all_dp2_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp2)
summary(all_dp2_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp2)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.124448 -0.017053 -0.007266  0.007309  0.184341 

Coefficients:
                     Estimate Std. Error t value             Pr(>|t|)    
(Intercept)          0.003933   0.001179   3.337             0.000857 ***
rt_predict_cxl_rate  0.313697   0.022016  14.249 < 0.0000000000000002 ***
knn_predict_cxl_rate 0.426355   0.019726  21.614 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.03603 on 3316 degrees of freedom
Multiple R-squared:  0.4358,    Adjusted R-squared:  0.4355 
F-statistic:  1281 on 2 and 3316 DF,  p-value: < 0.00000000000000022
all_dp3_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp3)
summary(all_dp3_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp3)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.261991 -0.015219 -0.007421  0.007183  0.203211 

Coefficients:
                      Estimate Std. Error t value            Pr(>|t|)    
(Intercept)          0.0125942  0.0009388   13.42 <0.0000000000000002 ***
rt_predict_cxl_rate  0.1540549  0.0096714   15.93 <0.0000000000000002 ***
knn_predict_cxl_rate 0.4895428  0.0115439   42.41 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0392 on 4835 degrees of freedom
Multiple R-squared:  0.4781,    Adjusted R-squared:  0.4779 
F-statistic:  2215 on 2 and 4835 DF,  p-value: < 0.00000000000000022
all_dp4_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp4)
summary(all_dp4_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp4)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.246545 -0.016321 -0.006689  0.008892  0.204088 

Coefficients:
                      Estimate Std. Error t value            Pr(>|t|)    
(Intercept)          0.0147137  0.0008005   18.38 <0.0000000000000002 ***
rt_predict_cxl_rate  0.1211626  0.0065015   18.64 <0.0000000000000002 ***
knn_predict_cxl_rate 0.5143450  0.0081984   62.74 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0395 on 6352 degrees of freedom
Multiple R-squared:  0.5588,    Adjusted R-squared:  0.5587 
F-statistic:  4023 on 2 and 6352 DF,  p-value: < 0.00000000000000022
all_dp5_mod <- lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, data = hot2_best_df_dp5)
summary(all_dp5_mod)

Call:
lm(formula = true_cxl_rate ~ rt_predict_cxl_rate + knn_predict_cxl_rate, 
    data = hot2_best_df_dp5)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.246634 -0.016923 -0.006714  0.010656  0.203957 

Coefficients:
                      Estimate Std. Error t value            Pr(>|t|)    
(Intercept)          0.0150824  0.0007582   19.89 <0.0000000000000002 ***
rt_predict_cxl_rate  0.1152467  0.0058386   19.74 <0.0000000000000002 ***
knn_predict_cxl_rate 0.5265252  0.0073226   71.90 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.03947 on 6998 degrees of freedom
Multiple R-squared:  0.5903,    Adjusted R-squared:  0.5902 
F-statistic:  5042 on 2 and 6998 DF,  p-value: < 0.00000000000000022
#create new predictions
hot2_best_df_dp1$predict_cxl_rate = (hot2_best_df_dp1$rt_predict_cxl_rate*0.210950 + hot2_best_df_dp1$knn_predict_cxl_rate*0.478290)
hot2_best_df_dp2$predict_cxl_rate = (hot2_best_df_dp2$rt_predict_cxl_rate*0.313697 + hot2_best_df_dp2$knn_predict_cxl_rate*0.426355)
hot2_best_df_dp3$predict_cxl_rate = (hot2_best_df_dp3$rt_predict_cxl_rate*0.1540549 + hot2_best_df_dp3$knn_predict_cxl_rate*0.4895428)
hot2_best_df_dp4$predict_cxl_rate = (hot2_best_df_dp4$rt_predict_cxl_rate*0.1211626 + hot2_best_df_dp4$knn_predict_cxl_rate*0.5143450)
hot2_best_df_dp5$predict_cxl_rate = (hot2_best_df_dp5$rt_predict_cxl_rate*0.1152467 + hot2_best_df_dp5$knn_predict_cxl_rate*0.5265252)
hot2_best_grouped <- merge(hot2_best_df_dp1,hot2_best_df_dp2, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp3, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp4, all = TRUE)
hot2_best_grouped <- merge(hot2_best_grouped,hot2_best_df_dp5, all = TRUE)
eval(hot2_best_grouped)
LS0tDQp0aXRsZTogIkhvdGVsIENhbmNlbGxhdGlvbiAtIENvbWJpbmVkIE1vZGVsIg0KYXV0aG9yOiAiQ2FpdGxpbiBIb3dhbnNreSAmIFdlaSBMaSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzMnDQogIGh0bWxfbm90ZWJvb2s6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KI19fR2V0IERhdGEgUmVhZHlfXw0KYGBge3IgbWVzc2FnZSA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGVycm9yID0gRkFMU0V9DQojIENsZWFyIGVudmlyb25tZW50IG9mIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zDQojcm0obGlzdCA9IGxzKGFsbCA9IFRSVUUpKSANCiMgQ2xlYXIgZW52aXJvbm1ldCBvZiBwYWNrYWdlcw0KI2lmKGlzLm51bGwoc2Vzc2lvbkluZm8oKSRvdGhlclBrZ3MpID09IEZBTFNFKWxhcHBseShwYXN0ZSgicGFja2FnZToiLCBuYW1lcyhzZXNzaW9uSW5mbygpJG90aGVyUGtncyksIHNlcD0iIiksIGRldGFjaCwgY2hhcmFjdGVyLm9ubHkgPSAjVFJVRSwgdW5sb2FkID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCg0KIyBsb2FkIHBhY2thZ2UNCmxpYnJhcnkoc2pQbG90KQ0KbGlicmFyeShzam1pc2MpDQpsaWJyYXJ5KHNqbGFiZWxsZWQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgDQpsaWJyYXJ5KGRwbHlyKSAjIGpvaW5zDQojbGlicmFyeShqYW5pdG9yKSAjIHByZXR0eSBjcm9zcy10YWJzDQpsaWJyYXJ5KGthYmxlRXh0cmEpICMgcHJldHR5IGh0bWwgdGFibGVzDQojbGlicmFyeShmb3JtYXR0YWJsZSkNCiNsaWJyYXJ5KGdyaWRFeHRyYSkNCiNsaWJyYXJ5KHNjYWxlcykNCiNsaWJyYXJ5KHBhc3RlY3MpDQojbGlicmFyeShHR2FsbHkpDQojbGlicmFyeShsdWJyaWRhdGUpDQojbGlicmFyeShkaXJlY3RsYWJlbHMpDQojbGlicmFyeShNZXRyaWNzKQ0KbGlicmFyeSh0cmVlKQ0KbGlicmFyeShJU0xSKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCiNsb2FkIGluIHdvcmtzcGFjZXMgZnJvbSBwcmV2aW9zIG1vZGVscw0KbG9hZCgnZW52LlJEYXRhJykgI2tubg0KbG9hZCgiZHRfZW52LlJkYXRhIikgI3JlZ3Jlc3Npb24gdHJlZQ0KbG9hZCgibXlfZW52LlJkYXRhIikgI2xpbmVhciByZWdyZXNzaW9uDQpsb2FkKCJuYWl2ZV9lbnYuUmRhdGEiKSAjbmFpdmUgbW9kZWwNCmBgYA0KDQojI19fQXRsYW50YSBIb3RlbF9fDQpgYGB7cn0NCiNiZXN0IG1vZGVscyBmb3IgaG90ZWwgMQ0KDQpiZXN0X25haXZlICNuYWl2ZSBtb2RlbA0KYmVzdF9tb2RlbF9saW4gICNsaW5lYXIgbW9kZWwNCmJlc3RfbW9kZWxfa25uICNrbm4NCmJlc3RfbW9kZWxfcnQgI3JlZ3Jlc3Npb24gdHJlZQ0KDQojY29tYmluZSBpbnRvIG9uZSBkYXRhZnJhbWUgdG8gaGF2ZSBhIGRhdGFmcmFtZSBvZiBhbGwgcHJlZGljdGVkIGNhbmNlbGxhdGlvbiByYXRlcw0KDQpiZXN0X21vZGVsX2tubiRrbm5fcHJlZGljdF9jeGxfcmF0ZSA8LSAgYmVzdF9tb2RlbF9rbm4kcHJlZGljdF9jeGxfcmF0ZQ0KYmVzdF9tb2RlbF9ydCRydF9wcmVkaWN0X2N4bF9yYXRlIDwtICBiZXN0X21vZGVsX3J0JHByZWRpY3RfY3hsX3JhdGUNCmJlc3RfbmFpdmUkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSA8LSBiZXN0X25haXZlJHByZWRpY3RfY3hsX3JhdGUNCg0KDQpob3QxX2Jlc3RfZGYgPC0gbGVmdF9qb2luKGJlc3RfbmFpdmUsIGJlc3RfbW9kZWxfbGluLCBieSA9IGMoJ2RheXNfcHJpb3InLCAnc3RheV9kdCcsICdwcm9kdWN0X3R5cGUnKSkNCmhvdDFfYmVzdF9kZiA8LSBsZWZ0X2pvaW4oaG90MV9iZXN0X2RmLCBiZXN0X21vZGVsX2tubiwgYnkgPSBjKCdkYXlzX3ByaW9yJywgJ3N0YXlfZHQnLCAncHJvZHVjdF90eXBlJykpDQpob3QxX2Jlc3RfZGYgPC0gbGVmdF9qb2luKGhvdDFfYmVzdF9kZiwgYmVzdF9tb2RlbF9ydCwgYnkgPSBjKCdkYXlzX3ByaW9yJywgJ3N0YXlfZHQnLCAncHJvZHVjdF90eXBlJykpDQphdmdfc3Z2X3J0IDwtIHN1bShob3QxX2Jlc3RfZGYkT1RCX3RvX3N1cnZpdmUueCkvc3VtKGhvdDFfYmVzdF9kZiRPVEIueCkNCg0KDQpob3QxX2Jlc3RfZGYgPC0gZGF0YS5mcmFtZShob3QxX2Jlc3RfZGYkdHJ1ZV9jeGxfcmF0ZSwgaG90MV9iZXN0X2RmJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUsIGhvdDFfYmVzdF9kZiRsaW5fcHJlZGljdF9jeGxfcmF0ZSwgaG90MV9iZXN0X2RmJGtubl9wcmVkaWN0X2N4bF9yYXRlLCBob3QxX2Jlc3RfZGYkcnRfcHJlZGljdF9jeGxfcmF0ZSwgaG90MV9iZXN0X2RmJE9UQi54LCBob3QxX2Jlc3RfZGYkT1RCX3RvX3N1cnZpdmUueCwgaG90MV9iZXN0X2RmJGRheXNfcHJpb3IpDQoNCiNyZW5hbWUgY29sdW1ucw0KaG90MV9iZXN0X2RmJHRydWVfY3hsX3JhdGUgPC0gaG90MV9iZXN0X2RmJGhvdDFfYmVzdF9kZi50cnVlX2N4bF9yYXRlDQpob3QxX2Jlc3RfZGYkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSA8LSBob3QxX2Jlc3RfZGYkaG90MV9iZXN0X2RmLm5haXZlX3ByZWRpY3RfY3hsX3JhdGUNCmhvdDFfYmVzdF9kZiRsaW5fcHJlZGljdF9jeGxfcmF0ZSA8LSBob3QxX2Jlc3RfZGYkaG90MV9iZXN0X2RmLmxpbl9wcmVkaWN0X2N4bF9yYXRlDQpob3QxX2Jlc3RfZGYka25uX3ByZWRpY3RfY3hsX3JhdGUgPC0gaG90MV9iZXN0X2RmJGhvdDFfYmVzdF9kZi5rbm5fcHJlZGljdF9jeGxfcmF0ZQ0KaG90MV9iZXN0X2RmJHJ0X3ByZWRpY3RfY3hsX3JhdGUgPC0gaG90MV9iZXN0X2RmJGhvdDFfYmVzdF9kZi5ydF9wcmVkaWN0X2N4bF9yYXRlDQpob3QxX2Jlc3RfZGYkT1RCIDwtIGhvdDFfYmVzdF9kZiRob3QxX2Jlc3RfZGYuT1RCLngNCmhvdDFfYmVzdF9kZiRPVEJfdG9fc3Vydml2ZSA8LSBob3QxX2Jlc3RfZGYkaG90MV9iZXN0X2RmLk9UQl90b19zdXJ2aXZlLngNCmhvdDFfYmVzdF9kZiRkYXlzX3ByaW9yIDwtIGhvdDFfYmVzdF9kZiRob3QxX2Jlc3RfZGYuZGF5c19wcmlvcg0KDQpgYGANCg0KYGBge3J9DQojcnVuIGxpbmVhciByZWdyZXNzaW9uIG9mIGFsbCB0byBmaW5kIHdlaWdodHMNCmFsbF9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSArIHJ0X3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGYpDQpzdW1tYXJ5KGFsbF9tb2QpDQpgYGANCg0KYGBge3J9DQojbmV3IHByZWRpY3Rpb24gZ2l2ZW4gYWJvdmUgd2VpZ2h0cw0KDQpob3QxX2Jlc3RfZGYkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGYkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjUwMzM3NjAgKyBob3QxX2Jlc3RfZGYkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDIyODUxMCArIGhvdDFfYmVzdF9kZiRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4wNDYzNzc1ICtob3QxX2Jlc3RfZGYkcnRfcHJlZGljdF9jeGxfcmF0ZSowLjA0MDIyNjEpDQoNCg0KZXZhbChob3QxX2Jlc3RfZGYpDQpgYGANCg0KYGBge3J9DQojdHJ5IHRvIGRvIGJ5IGRpZmZlcmVudCBkYXlzIG9mIHdlZWsNCmhvdDFfYmVzdF9kZl9kcDEgPC0gaG90MV9iZXN0X2RmW2hvdDFfYmVzdF9kZiRkYXlzX3ByaW9yIDw9IDcsIF0gDQpob3QxX2Jlc3RfZGZfZHAyIDwtIGhvdDFfYmVzdF9kZltob3QxX2Jlc3RfZGYkZGF5c19wcmlvciA8PSAxNCwgXQ0KaG90MV9iZXN0X2RmX2RwMyA8LSBob3QxX2Jlc3RfZGZbaG90MV9iZXN0X2RmJGRheXNfcHJpb3IgPD0gMjEsIF0NCmhvdDFfYmVzdF9kZl9kcDQgPC0gaG90MV9iZXN0X2RmW2hvdDFfYmVzdF9kZiRkYXlzX3ByaW9yIDw9IDI4LCBdDQpob3QxX2Jlc3RfZGZfZHA1IDwtIGhvdDFfYmVzdF9kZltob3QxX2Jlc3RfZGYkZGF5c19wcmlvciA8PSAzMiwgXQ0KYGBgDQoNCg0KYGBge3J9DQojcnVuIGxpbmVhciByZWdyZXNzaW9uIGJhc2VkIG9uIGRpZmZlcmVudCBncm91cHMNCmFsbF9kcDFfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMSkNCnN1bW1hcnkoYWxsX2RwMV9tb2QpDQoNCmFsbF9kcDJfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMikNCnN1bW1hcnkoYWxsX2RwMl9tb2QpDQoNCmFsbF9kcDNfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMykNCnN1bW1hcnkoYWxsX2RwM19tb2QpDQoNCmFsbF9kcDRfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwNCkNCnN1bW1hcnkoYWxsX2RwNF9tb2QpDQoNCmFsbF9kcDVfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwNSkNCnN1bW1hcnkoYWxsX2RwNV9tb2QpDQpgYGANCg0KYGBge3J9DQojY3JlYXRlIG5ldyBwcmVkaWN0aW9ucw0KaG90MV9iZXN0X2RmX2RwMSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDEkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjg2MzY4MSArIGhvdDFfYmVzdF9kZl9kcDEkbGluX3ByZWRpY3RfY3hsX3JhdGUqMC4wMTc1NjggKyBob3QxX2Jlc3RfZGZfZHAxJGtubl9wcmVkaWN0X2N4bF9yYXRlKjAuMDc2NDU1ICtob3QxX2Jlc3RfZGZfZHAxJHJ0X3ByZWRpY3RfY3hsX3JhdGUqLTAuMDAyNTg2KQ0KDQpob3QxX2Jlc3RfZGZfZHAyJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwMiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuODEzNjkzICsgaG90MV9iZXN0X2RmX2RwMiRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMTQ3NjYgKyBob3QxX2Jlc3RfZGZfZHAyJGtubl9wcmVkaWN0X2N4bF9yYXRlKjAuMDAzNTIyICtob3QxX2Jlc3RfZGZfZHAyJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wMTMyODEpDQoNCmhvdDFfYmVzdF9kZl9kcDMkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAzJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC41ODkyODUxICsgaG90MV9iZXN0X2RmX2RwMyRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMjEzMDM2ICsgaG90MV9iZXN0X2RmX2RwMyRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMzcxMjY0ICtob3QxX2Jlc3RfZGZfZHAzJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wNDA4Njk2KQ0KDQpob3QxX2Jlc3RfZGZfZHA0JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwNCRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuNDcyNzQ2NSArIGhvdDFfYmVzdF9kZl9kcDQkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDE5NTMwOCArIGhvdDFfYmVzdF9kZl9kcDQka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDQ4MDk1MiAraG90MV9iZXN0X2RmX2RwNCRydF9wcmVkaWN0X2N4bF9yYXRlKi0wLjA0ODA5NTIpDQoNCmhvdDFfYmVzdF9kZl9kcDUkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHA1JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC41MDMzNzYwICsgaG90MV9iZXN0X2RmX2RwNSRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMjI4NTEwICsgaG90MV9iZXN0X2RmX2RwNSRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4wNDYzNzc1ICtob3QxX2Jlc3RfZGZfZHA1JHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wNDAyMjYxKQ0KDQoNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9kZl9kcDEsaG90MV9iZXN0X2RmX2RwMiwgYWxsID0gVFJVRSkNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9ncm91cGVkLGhvdDFfYmVzdF9kZl9kcDMsIGFsbCA9IFRSVUUpDQpob3QxX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QxX2Jlc3RfZ3JvdXBlZCxob3QxX2Jlc3RfZGZfZHA0LCBhbGwgPSBUUlVFKQ0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2dyb3VwZWQsaG90MV9iZXN0X2RmX2RwNSwgYWxsID0gVFJVRSkNCg0KZXZhbChob3QxX2Jlc3RfZ3JvdXBlZCkNCmBgYA0KDQpgYGB7cn0NCiNjaG9vc2UgbmFpdmUgYW5kIGxpbmVhcg0KYWxsX2RwMV9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHAxKQ0Kc3VtbWFyeShhbGxfZHAxX21vZCkNCg0KYWxsX2RwMl9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHAyKQ0Kc3VtbWFyeShhbGxfZHAyX21vZCkNCg0KYWxsX2RwM19tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHAzKQ0Kc3VtbWFyeShhbGxfZHAzX21vZCkNCg0KYWxsX2RwNF9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHA0KQ0Kc3VtbWFyeShhbGxfZHA0X21vZCkNCg0KYWxsX2RwNV9tb2QgPC0gbG0oZm9ybXVsYSA9IHRydWVfY3hsX3JhdGUgfiBuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlICsgbGluX3ByZWRpY3RfY3hsX3JhdGUsIGRhdGEgPSBob3QxX2Jlc3RfZGZfZHA1KQ0Kc3VtbWFyeShhbGxfZHA1X21vZCkNCg0KYGBgDQoNCmBgYHtyfQ0KI2NyZWF0ZSBuZXcgcHJlZGljdGlvbnMNCmhvdDFfYmVzdF9kZl9kcDEkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAxJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45MDY1ODMgKyBob3QxX2Jlc3RfZGZfZHAxJGxpbl9wcmVkaWN0X2N4bF9yYXRlKjAuMDI1NzYzKQ0KDQpob3QxX2Jlc3RfZGZfZHAyJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwMiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuODIyNDgwMCArIGhvdDFfYmVzdF9kZl9kcDIkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDEyMDU1MCkNCg0KaG90MV9iZXN0X2RmX2RwMyRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDMkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjU3NjY1OTEgKyBob3QxX2Jlc3RfZGZfZHAzJGxpbl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAyMDUwNTUpDQoNCmhvdDFfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC40NDUyODYxICsgaG90MV9iZXN0X2RmX2RwNCRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMTczNjQ4KQ0KDQpob3QxX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwNSRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuNDczMjc2NCArIGhvdDFfYmVzdF9kZl9kcDUkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDE4MzYwOSApDQoNCg0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2RmX2RwMSxob3QxX2Jlc3RfZGZfZHAyLCBhbGwgPSBUUlVFKQ0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2dyb3VwZWQsaG90MV9iZXN0X2RmX2RwMywgYWxsID0gVFJVRSkNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9ncm91cGVkLGhvdDFfYmVzdF9kZl9kcDQsIGFsbCA9IFRSVUUpDQpob3QxX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QxX2Jlc3RfZ3JvdXBlZCxob3QxX2Jlc3RfZGZfZHA1LCBhbGwgPSBUUlVFKQ0KDQpldmFsKGhvdDFfYmVzdF9ncm91cGVkKQ0KYGBgDQoNCg0KYGBge3J9DQojY2hvb3NlIG5haXZlIGFuZCBrbm4NCmFsbF9kcDFfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMSkNCnN1bW1hcnkoYWxsX2RwMV9tb2QpDQoNCmFsbF9kcDJfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMikNCnN1bW1hcnkoYWxsX2RwMl9tb2QpDQoNCmFsbF9kcDNfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwMykNCnN1bW1hcnkoYWxsX2RwM19tb2QpDQoNCmFsbF9kcDRfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwNCkNCnN1bW1hcnkoYWxsX2RwNF9tb2QpDQoNCmFsbF9kcDVfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90MV9iZXN0X2RmX2RwNSkNCnN1bW1hcnkoYWxsX2RwNV9tb2QpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI2NyZWF0ZSBuZXcgcHJlZGljdGlvbnMNCmhvdDFfYmVzdF9kZl9kcDEkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAxJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC44NjY0MTMzICsgaG90MV9iZXN0X2RmX2RwMSRrbm5fcHJlZGljdF9jeGxfcmF0ZSowLjA4NDM3NTcpDQoNCmhvdDFfYmVzdF9kZl9kcDIkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAyJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC44MTE4NjU0NCArIGhvdDFfYmVzdF9kZl9kcDIka25uX3ByZWRpY3RfY3hsX3JhdGUqMC4wMDAwNDU5MSkNCg0KaG90MV9iZXN0X2RmX2RwMyRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDMkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjU4MTEwMTMgKyBob3QxX2Jlc3RfZGZfZHAzJGtubl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAzNDk0NTUpDQoNCmhvdDFfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC40NTU2MjcgKyBob3QxX2Jlc3RfZGZfZHA0JGtubl9wcmVkaWN0X2N4bF9yYXRlKi0wLjA0MjA4MikNCg0KaG90MV9iZXN0X2RmX2RwNSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDUkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjQ3ODk1NDkgKyBob3QxX2Jlc3RfZGZfZHA1JGtubl9wcmVkaWN0X2N4bF9yYXRlKi0wLjA0MTM4OTIgKQ0KDQoNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9kZl9kcDEsaG90MV9iZXN0X2RmX2RwMiwgYWxsID0gVFJVRSkNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9ncm91cGVkLGhvdDFfYmVzdF9kZl9kcDMsIGFsbCA9IFRSVUUpDQpob3QxX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QxX2Jlc3RfZ3JvdXBlZCxob3QxX2Jlc3RfZGZfZHA0LCBhbGwgPSBUUlVFKQ0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2dyb3VwZWQsaG90MV9iZXN0X2RmX2RwNSwgYWxsID0gVFJVRSkNCg0KZXZhbChob3QxX2Jlc3RfZ3JvdXBlZCkNCmBgYA0KDQoNCmBgYHtyfQ0KI2Nob29zZSBydCBhbmQga25uDQphbGxfZHAxX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDEpDQpzdW1tYXJ5KGFsbF9kcDFfbW9kKQ0KDQphbGxfZHAyX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDIpDQpzdW1tYXJ5KGFsbF9kcDJfbW9kKQ0KDQphbGxfZHAzX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDMpDQpzdW1tYXJ5KGFsbF9kcDNfbW9kKQ0KDQphbGxfZHA0X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDQpDQpzdW1tYXJ5KGFsbF9kcDRfbW9kKQ0KDQphbGxfZHA1X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDFfYmVzdF9kZl9kcDUpDQpzdW1tYXJ5KGFsbF9kcDVfbW9kKQ0KDQpgYGANCg0KYGBge3J9DQojY3JlYXRlIG5ldyBwcmVkaWN0aW9ucw0KaG90MV9iZXN0X2RmX2RwMSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDFfYmVzdF9kZl9kcDEkcnRfcHJlZGljdF9jeGxfcmF0ZSowLjA2NTY5NCArIGhvdDFfYmVzdF9kZl9kcDEka25uX3ByZWRpY3RfY3hsX3JhdGUqMC4yNDkyNjMpDQoNCmhvdDFfYmVzdF9kZl9kcDIkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAyJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wODg4ODM4ICsgaG90MV9iZXN0X2RmX2RwMiRrbm5fcHJlZGljdF9jeGxfcmF0ZSowLjA5NTcxMTEpDQoNCmhvdDFfYmVzdF9kZl9kcDMkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QxX2Jlc3RfZGZfZHAzJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wNzk5ODUgKyBob3QxX2Jlc3RfZGZfZHAzJGtubl9wcmVkaWN0X2N4bF9yYXRlKjAuMDY1Mjg5KQ0KDQpob3QxX2Jlc3RfZGZfZHA0JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwNCRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMDY5MDM2NiArIGhvdDFfYmVzdF9kZl9kcDQka25uX3ByZWRpY3RfY3hsX3JhdGUqMC4wNDUxNzEyKQ0KDQpob3QxX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90MV9iZXN0X2RmX2RwNSRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMDUyNzI4NyArIGhvdDFfYmVzdF9kZl9kcDUka25uX3ByZWRpY3RfY3hsX3JhdGUqMC4wNDE4MDgwKQ0KDQoNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9kZl9kcDEsaG90MV9iZXN0X2RmX2RwMiwgYWxsID0gVFJVRSkNCmhvdDFfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDFfYmVzdF9ncm91cGVkLGhvdDFfYmVzdF9kZl9kcDMsIGFsbCA9IFRSVUUpDQpob3QxX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QxX2Jlc3RfZ3JvdXBlZCxob3QxX2Jlc3RfZGZfZHA0LCBhbGwgPSBUUlVFKQ0KaG90MV9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90MV9iZXN0X2dyb3VwZWQsaG90MV9iZXN0X2RmX2RwNSwgYWxsID0gVFJVRSkNCg0KZXZhbChob3QxX2Jlc3RfZ3JvdXBlZCkNCmBgYA0KDQoNCi0gTGluZWFyIFJlZ3Jlc3Npb24gYW5kIG5haXZlIHJlc3VsdHMgaW4gdGhlIGJlc3QgbW9kZWwNCg0KDQojI19fTlkgSG90ZWxfXw0KYGBge3J9DQojYmVzdCBtb2RlbHMgZm9yIGhvdGVsIDINCg0KYmVzdF9uYWl2ZV9ob3QyICNuYWl2ZSBtb2RlbA0KYmVzdF9tb2RlbF9saW5faG90MiAgI2xpbmVhciBtb2RlbA0KYmVzdF9tb2RlbF9rbm5faG90MiAja25uDQpiZXN0X21vZGVsX3J0X2hvdDIgI3JlZ3Jlc3Npb24gdHJlZQ0KDQojY29tYmluZSBpbnRvIG9uZSBkYXRhZnJhbWUgdG8gaGF2ZSBhIGRhdGFmcmFtZSBvZiBhbGwgcHJlZGljdGVkIGNhbmNlbGxhdGlvbiByYXRlcw0KDQpiZXN0X21vZGVsX2tubl9ob3QyJGtubl9wcmVkaWN0X2N4bF9yYXRlIDwtICBiZXN0X21vZGVsX2tubl9ob3QyJHByZWRpY3RfY3hsX3JhdGUNCmJlc3RfbW9kZWxfcnRfaG90MiRydF9wcmVkaWN0X2N4bF9yYXRlIDwtICBiZXN0X21vZGVsX3J0X2hvdDIkcHJlZGljdF9jeGxfcmF0ZQ0KYmVzdF9uYWl2ZV9ob3QyJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgPC0gYmVzdF9uYWl2ZV9ob3QyJHByZWRpY3RfY3hsX3JhdGUNCmJlc3RfbW9kZWxfbGluX2hvdDIkbGluX3ByZWRpY3RfY3hsX3JhdGUgPC0gYmVzdF9tb2RlbF9saW5faG90MiRwcmVkaWN0X2N4bF9yYXRlDQoNCg0KaG90Ml9iZXN0X2RmIDwtIGxlZnRfam9pbihiZXN0X25haXZlX2hvdDIsIGJlc3RfbW9kZWxfbGluX2hvdDIsIGJ5ID0gYygnZGF5c19wcmlvcicsICdzdGF5X2R0JywgJ3Byb2R1Y3RfdHlwZScpKQ0KaG90Ml9iZXN0X2RmIDwtIGxlZnRfam9pbihob3QyX2Jlc3RfZGYsIGJlc3RfbW9kZWxfa25uX2hvdDIsIGJ5ID0gYygnZGF5c19wcmlvcicsICdzdGF5X2R0JywgJ3Byb2R1Y3RfdHlwZScpKQ0KaG90Ml9iZXN0X2RmIDwtIGxlZnRfam9pbihob3QyX2Jlc3RfZGYsIGJlc3RfbW9kZWxfcnRfaG90MiwgYnkgPSBjKCdkYXlzX3ByaW9yJywgJ3N0YXlfZHQnLCAncHJvZHVjdF90eXBlJykpDQphdmdfc3Z2X3J0IDwtIHN1bShob3QyX2Jlc3RfZGYkT1RCX3RvX3N1cnZpdmUueCkvc3VtKGhvdDJfYmVzdF9kZiRPVEIueCkNCg0KDQoNCmhvdDJfYmVzdF9kZiA8LSBkYXRhLmZyYW1lKGhvdDJfYmVzdF9kZiR0cnVlX2N4bF9yYXRlLCBob3QyX2Jlc3RfZGYkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSwgaG90Ml9iZXN0X2RmJGxpbl9wcmVkaWN0X2N4bF9yYXRlLCBob3QyX2Jlc3RfZGYka25uX3ByZWRpY3RfY3hsX3JhdGUsIGhvdDJfYmVzdF9kZiRydF9wcmVkaWN0X2N4bF9yYXRlLCBob3QyX2Jlc3RfZGYkT1RCLngsIGhvdDJfYmVzdF9kZiRPVEJfdG9fc3Vydml2ZS54LCBob3QyX2Jlc3RfZGYkZGF5c19wcmlvcikNCg0KI3JlbmFtZSBjb2x1bW5zDQpob3QyX2Jlc3RfZGYkdHJ1ZV9jeGxfcmF0ZSA8LSBob3QyX2Jlc3RfZGYkaG90Ml9iZXN0X2RmLnRydWVfY3hsX3JhdGUNCmhvdDJfYmVzdF9kZiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlIDwtIGhvdDJfYmVzdF9kZiRob3QyX2Jlc3RfZGYubmFpdmVfcHJlZGljdF9jeGxfcmF0ZQ0KaG90Ml9iZXN0X2RmJGxpbl9wcmVkaWN0X2N4bF9yYXRlIDwtIGhvdDJfYmVzdF9kZiRob3QyX2Jlc3RfZGYubGluX3ByZWRpY3RfY3hsX3JhdGUNCmhvdDJfYmVzdF9kZiRrbm5fcHJlZGljdF9jeGxfcmF0ZSA8LSBob3QyX2Jlc3RfZGYkaG90Ml9iZXN0X2RmLmtubl9wcmVkaWN0X2N4bF9yYXRlDQpob3QyX2Jlc3RfZGYkcnRfcHJlZGljdF9jeGxfcmF0ZSA8LSBob3QyX2Jlc3RfZGYkaG90Ml9iZXN0X2RmLnJ0X3ByZWRpY3RfY3hsX3JhdGUNCmhvdDJfYmVzdF9kZiRPVEIgPC0gaG90Ml9iZXN0X2RmJGhvdDJfYmVzdF9kZi5PVEIueA0KaG90Ml9iZXN0X2RmJE9UQl90b19zdXJ2aXZlIDwtIGhvdDJfYmVzdF9kZiRob3QyX2Jlc3RfZGYuT1RCX3RvX3N1cnZpdmUueA0KaG90Ml9iZXN0X2RmJGRheXNfcHJpb3IgPC0gaG90Ml9iZXN0X2RmJGhvdDJfYmVzdF9kZi5kYXlzX3ByaW9yDQoNCg0KYGBgDQoNCmBgYHtyfQ0KI3J1biBsaW5lYXIgcmVncmVzc2lvbiBvZiBhbGwgdG8gZmluZCB3ZWlnaHRzDQphbGxfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmKQ0Kc3VtbWFyeShhbGxfbW9kKQ0KYGBgDQoNCmBgYHtyfQ0KI25ldyBwcmVkaWN0aW9uIGdpdmVuIGFib3ZlIHdlaWdodHMNCg0KaG90Ml9iZXN0X2RmJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMS4wNTg5MjA4ICsgaG90Ml9iZXN0X2RmJGxpbl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAxOTA5NTIgKyBob3QyX2Jlc3RfZGYka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDgxNjYxMCAraG90Ml9iZXN0X2RmJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wMDUwMDg3KQ0KDQoNCmV2YWwoaG90Ml9iZXN0X2RmKQ0KYGBgDQoNCg0KYGBge3J9DQojdHJ5IHRvIGRvIGJ5IGRpZmZlcmVudCBkYXlzIG9mIHdlZWsNCmhvdDJfYmVzdF9kZl9kcDEgPC0gaG90Ml9iZXN0X2RmW2hvdDJfYmVzdF9kZiRkYXlzX3ByaW9yIDw9IDcsIF0gDQpob3QyX2Jlc3RfZGZfZHAyIDwtIGhvdDJfYmVzdF9kZltob3QyX2Jlc3RfZGYkZGF5c19wcmlvciA8PSAxNCwgXQ0KaG90Ml9iZXN0X2RmX2RwMyA8LSBob3QyX2Jlc3RfZGZbaG90Ml9iZXN0X2RmJGRheXNfcHJpb3IgPD0gMjEsIF0NCmhvdDJfYmVzdF9kZl9kcDQgPC0gaG90Ml9iZXN0X2RmW2hvdDJfYmVzdF9kZiRkYXlzX3ByaW9yIDw9IDI4LCBdDQpob3QyX2Jlc3RfZGZfZHA1IDwtIGhvdDJfYmVzdF9kZltob3QyX2Jlc3RfZGYkZGF5c19wcmlvciA8PSAzMiwgXQ0KYGBgDQoNCg0KYGBge3J9DQojcnVuIGxpbmVhciByZWdyZXNzaW9uIGJhc2VkIG9uIGRpZmZlcmVudCBncm91cHMNCmFsbF9kcDFfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMSkNCnN1bW1hcnkoYWxsX2RwMV9tb2QpDQoNCmFsbF9kcDJfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMikNCnN1bW1hcnkoYWxsX2RwMl9tb2QpDQoNCmFsbF9kcDNfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMykNCnN1bW1hcnkoYWxsX2RwM19tb2QpDQoNCmFsbF9kcDRfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwNCkNCnN1bW1hcnkoYWxsX2RwNF9tb2QpDQoNCmFsbF9kcDVfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGxpbl9wcmVkaWN0X2N4bF9yYXRlICsga25uX3ByZWRpY3RfY3hsX3JhdGUgKyBydF9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwNSkNCnN1bW1hcnkoYWxsX2RwNV9tb2QpDQpgYGANCg0KDQoNCmBgYHtyfQ0KI2NyZWF0ZSBuZXcgcHJlZGljdGlvbnMNCmhvdDJfYmVzdF9kZl9kcDEkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAxJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45MzQ3NTEgKyBob3QyX2Jlc3RfZGZfZHAxJGxpbl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAwMzk2OCArIGhvdDJfYmVzdF9kZl9kcDEka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDQ5MDQwICtob3QyX2Jlc3RfZGZfZHAxJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wMjYxODgpDQoNCmhvdDJfYmVzdF9kZl9kcDIkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAyJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMS4zMDkwODIgKyBob3QyX2Jlc3RfZGZfZHAyJGxpbl9wcmVkaWN0X2N4bF9yYXRlKi0wLjAwNTg5MiArIGhvdDJfYmVzdF9kZl9kcDIka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMzAzMjE0ICtob3QyX2Jlc3RfZGZfZHAyJHJ0X3ByZWRpY3RfY3hsX3JhdGUqLTAuMDcxODc1KQ0KDQpob3QyX2Jlc3RfZGZfZHAzJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwMyRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjEuMjYwNjYyMiArIGhvdDJfYmVzdF9kZl9kcDMkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDE3NDM5NiArIGhvdDJfYmVzdF9kZl9kcDMka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMzIzNDU3MSAraG90Ml9iZXN0X2RmX2RwMyRydF9wcmVkaWN0X2N4bF9yYXRlKi0wLjAwNzA1MzApDQoNCmhvdDJfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMS4xMDcxMjQyICsgaG90Ml9iZXN0X2RmX2RwNCRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMTk1MzA4ICsgaG90Ml9iZXN0X2RmX2RwNCRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4xMzc5NjA0ICtob3QyX2Jlc3RfZGZfZHA0JHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4wMDA5MTgxKQ0KDQpob3QyX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNSRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjEuMDU4OTIwOCArIGhvdDJfYmVzdF9kZl9kcDUkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDE5MDk1MiArIGhvdDJfYmVzdF9kZl9kcDUka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDgxNjYxMCAraG90Ml9iZXN0X2RmX2RwNSRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMDA1MDA4NykNCg0KDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZGZfZHAxLGhvdDJfYmVzdF9kZl9kcDIsIGFsbCA9IFRSVUUpDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZ3JvdXBlZCxob3QyX2Jlc3RfZGZfZHAzLCBhbGwgPSBUUlVFKQ0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2dyb3VwZWQsaG90Ml9iZXN0X2RmX2RwNCwgYWxsID0gVFJVRSkNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9ncm91cGVkLGhvdDJfYmVzdF9kZl9kcDUsIGFsbCA9IFRSVUUpDQoNCg0KDQoNCmV2YWwoaG90Ml9iZXN0X2dyb3VwZWQpDQpgYGANCmBgYHtyfQ0KI2Nob29zZSBuYWl2ZSBhbmQgbGluZWFyDQphbGxfZHAxX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDEpDQpzdW1tYXJ5KGFsbF9kcDFfbW9kKQ0KDQphbGxfZHAyX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDIpDQpzdW1tYXJ5KGFsbF9kcDJfbW9kKQ0KDQphbGxfZHAzX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDMpDQpzdW1tYXJ5KGFsbF9kcDNfbW9kKQ0KDQphbGxfZHA0X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDQpDQpzdW1tYXJ5KGFsbF9kcDRfbW9kKQ0KDQphbGxfZHA1X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IG5haXZlX3ByZWRpY3RfY3hsX3JhdGUgKyBsaW5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDUpDQpzdW1tYXJ5KGFsbF9kcDVfbW9kKQ0KDQpgYGANCg0KYGBge3J9DQojY3JlYXRlIG5ldyBwcmVkaWN0aW9ucw0KaG90Ml9iZXN0X2RmX2RwMSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDJfYmVzdF9kZl9kcDEkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSowLjkwODY4OSArIGhvdDJfYmVzdF9kZl9kcDEkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDA0NDk1KQ0KDQpob3QyX2Jlc3RfZGZfZHAyJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwMiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjEuMDA3MjAyICsgaG90Ml9iZXN0X2RmX2RwMiRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMTgwODUpDQoNCmhvdDJfYmVzdF9kZl9kcDMkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAzJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45NjM2NDA5MCArIGhvdDJfYmVzdF9kZl9kcDMkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDI4NTcyOTEpDQoNCmhvdDJfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45NzIzOTkyICsgaG90Ml9iZXN0X2RmX2RwNCRsaW5fcHJlZGljdF9jeGxfcmF0ZSotMC4wMjg3NzYyKQ0KDQpob3QyX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNSRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuOTgwNzgxNiArIGhvdDJfYmVzdF9kZl9kcDUkbGluX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDI1Njk4MCApDQoNCg0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2RmX2RwMSxob3QyX2Jlc3RfZGZfZHAyLCBhbGwgPSBUUlVFKQ0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2dyb3VwZWQsaG90Ml9iZXN0X2RmX2RwMywgYWxsID0gVFJVRSkNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9ncm91cGVkLGhvdDJfYmVzdF9kZl9kcDQsIGFsbCA9IFRSVUUpDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZ3JvdXBlZCxob3QyX2Jlc3RfZGZfZHA1LCBhbGwgPSBUUlVFKQ0KDQpldmFsKGhvdDJfYmVzdF9ncm91cGVkKQ0KYGBgDQoNCg0KYGBge3J9DQojY2hvb3NlIG5haXZlIGFuZCBrbm4NCmFsbF9kcDFfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMSkNCnN1bW1hcnkoYWxsX2RwMV9tb2QpDQoNCmFsbF9kcDJfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMikNCnN1bW1hcnkoYWxsX2RwMl9tb2QpDQoNCmFsbF9kcDNfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwMykNCnN1bW1hcnkoYWxsX2RwM19tb2QpDQoNCmFsbF9kcDRfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwNCkNCnN1bW1hcnkoYWxsX2RwNF9tb2QpDQoNCmFsbF9kcDVfbW9kIDwtIGxtKGZvcm11bGEgPSB0cnVlX2N4bF9yYXRlIH4gbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSArIGtubl9wcmVkaWN0X2N4bF9yYXRlLCBkYXRhID0gaG90Ml9iZXN0X2RmX2RwNSkNCnN1bW1hcnkoYWxsX2RwNV9tb2QpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KI2NyZWF0ZSBuZXcgcHJlZGljdGlvbnMNCmhvdDJfYmVzdF9kZl9kcDEkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAxJG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMC45MDI5MjE5ICsgaG90Ml9iZXN0X2RmX2RwMSRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4wNTcwMTA4KQ0KDQpob3QyX2Jlc3RfZGZfZHAyJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwMiRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjEuMTM5Mjk0MSArIGhvdDJfYmVzdF9kZl9kcDIka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMjI3NzE5NikNCg0KaG90Ml9iZXN0X2RmX2RwMyRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDJfYmVzdF9kZl9kcDMkbmFpdmVfcHJlZGljdF9jeGxfcmF0ZSoxLjEzMTg3NDkgKyBob3QyX2Jlc3RfZGZfZHAzJGtubl9wcmVkaWN0X2N4bF9yYXRlKi0wLjIzOTMzOTkpDQoNCmhvdDJfYmVzdF9kZl9kcDQkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHA0JG5haXZlX3ByZWRpY3RfY3hsX3JhdGUqMS4wMzA3MTc4ICsgaG90Ml9iZXN0X2RmX2RwNCRrbm5fcHJlZGljdF9jeGxfcmF0ZSotMC4xMTE4OTQ4KQ0KDQpob3QyX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNSRuYWl2ZV9wcmVkaWN0X2N4bF9yYXRlKjAuOTk0MDk2OCArIGhvdDJfYmVzdF9kZl9kcDUka25uX3ByZWRpY3RfY3hsX3JhdGUqLTAuMDYzNjA5NykNCg0KDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZGZfZHAxLGhvdDJfYmVzdF9kZl9kcDIsIGFsbCA9IFRSVUUpDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZ3JvdXBlZCxob3QyX2Jlc3RfZGZfZHAzLCBhbGwgPSBUUlVFKQ0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2dyb3VwZWQsaG90Ml9iZXN0X2RmX2RwNCwgYWxsID0gVFJVRSkNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9ncm91cGVkLGhvdDJfYmVzdF9kZl9kcDUsIGFsbCA9IFRSVUUpDQoNCmV2YWwoaG90Ml9iZXN0X2dyb3VwZWQpDQpgYGANCg0KDQoNCmBgYHtyfQ0KI2Nob29zZSBydCBhbmQga25uDQphbGxfZHAxX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDEpDQpzdW1tYXJ5KGFsbF9kcDFfbW9kKQ0KDQphbGxfZHAyX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDIpDQpzdW1tYXJ5KGFsbF9kcDJfbW9kKQ0KDQphbGxfZHAzX21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDMpDQpzdW1tYXJ5KGFsbF9kcDNfbW9kKQ0KDQphbGxfZHA0X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDQpDQpzdW1tYXJ5KGFsbF9kcDRfbW9kKQ0KDQphbGxfZHA1X21vZCA8LSBsbShmb3JtdWxhID0gdHJ1ZV9jeGxfcmF0ZSB+IHJ0X3ByZWRpY3RfY3hsX3JhdGUgKyBrbm5fcHJlZGljdF9jeGxfcmF0ZSwgZGF0YSA9IGhvdDJfYmVzdF9kZl9kcDUpDQpzdW1tYXJ5KGFsbF9kcDVfbW9kKQ0KDQpgYGANCg0KYGBge3J9DQojY3JlYXRlIG5ldyBwcmVkaWN0aW9ucw0KaG90Ml9iZXN0X2RmX2RwMSRwcmVkaWN0X2N4bF9yYXRlID0gKGhvdDJfYmVzdF9kZl9kcDEkcnRfcHJlZGljdF9jeGxfcmF0ZSowLjIxMDk1MCArIGhvdDJfYmVzdF9kZl9kcDEka25uX3ByZWRpY3RfY3hsX3JhdGUqMC40NzgyOTApDQoNCmhvdDJfYmVzdF9kZl9kcDIkcHJlZGljdF9jeGxfcmF0ZSA9IChob3QyX2Jlc3RfZGZfZHAyJHJ0X3ByZWRpY3RfY3hsX3JhdGUqMC4zMTM2OTcgKyBob3QyX2Jlc3RfZGZfZHAyJGtubl9wcmVkaWN0X2N4bF9yYXRlKjAuNDI2MzU1KQ0KDQpob3QyX2Jlc3RfZGZfZHAzJHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwMyRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMTU0MDU0OSArIGhvdDJfYmVzdF9kZl9kcDMka25uX3ByZWRpY3RfY3hsX3JhdGUqMC40ODk1NDI4KQ0KDQpob3QyX2Jlc3RfZGZfZHA0JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNCRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMTIxMTYyNiArIGhvdDJfYmVzdF9kZl9kcDQka25uX3ByZWRpY3RfY3hsX3JhdGUqMC41MTQzNDUwKQ0KDQpob3QyX2Jlc3RfZGZfZHA1JHByZWRpY3RfY3hsX3JhdGUgPSAoaG90Ml9iZXN0X2RmX2RwNSRydF9wcmVkaWN0X2N4bF9yYXRlKjAuMTE1MjQ2NyArIGhvdDJfYmVzdF9kZl9kcDUka25uX3ByZWRpY3RfY3hsX3JhdGUqMC41MjY1MjUyKQ0KDQoNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9kZl9kcDEsaG90Ml9iZXN0X2RmX2RwMiwgYWxsID0gVFJVRSkNCmhvdDJfYmVzdF9ncm91cGVkIDwtIG1lcmdlKGhvdDJfYmVzdF9ncm91cGVkLGhvdDJfYmVzdF9kZl9kcDMsIGFsbCA9IFRSVUUpDQpob3QyX2Jlc3RfZ3JvdXBlZCA8LSBtZXJnZShob3QyX2Jlc3RfZ3JvdXBlZCxob3QyX2Jlc3RfZGZfZHA0LCBhbGwgPSBUUlVFKQ0KaG90Ml9iZXN0X2dyb3VwZWQgPC0gbWVyZ2UoaG90Ml9iZXN0X2dyb3VwZWQsaG90Ml9iZXN0X2RmX2RwNSwgYWxsID0gVFJVRSkNCg0KZXZhbChob3QyX2Jlc3RfZ3JvdXBlZCkNCmBgYA0KDQoNCg==